<?php
/**
 * 权限访问过滤处理
 *
 * @author Mo yi <root@imoi.cn>
 * @link   http://www.imoi.cn
 * @copyright Copyright &copy; 2010-2012 DuoLam Software LLC
 * @license http://www.imoi.cn/license/
 * @version $Id: dpAuthFilter.php 1 2012-04-22 14:41:54Z Mo.yi $
 * @package db
 * @since 1.0
 */

class dpAuthFilter extends dpComponent
{
	/**
	 * 过滤规则
	 */
	private $_filter;

	/**
	 * 当前访问的控制器
	 */
	private $_control;

	/**
	 * 用户对象实例
	 */
	private $_user;

	/**
	 * 过滤信息保存器
	 */
	private $_error;

	/**
	 * 过滤信息列表
	 */
	private $_info = array(
		'1' => '您当前的IP在禁止列表中，不能访问该页面',
		'2' => '您当前的帐户在禁止访问列表',
	);

	/**
	 * 构造方法
	 * @param object $user 用户实例
	 * @param object $control 当前控制器实例
	 */
	public function __construct($user, $control)
	{
		$this->_user = $user;
		$this->_control = $control;
	}

	/**
	 * 运行过滤
	 * @param array $filter 过滤规则
	 */
	public function run($filter)
	{
		$this->_filter = $filter;
		$this->_checkIp();
		$this->_checkUserName();
		$this->_checkMethod();

		if (empty($this->_error)) return true;
		else return false;
	}

	/**
	 * 获取过滤信息
	 * @return string
	 */
	public function getError()
	{
		return trim($this->_error,'<br />');
	}

	/**
	 * 设置过滤信息
	 * @param string $error 
	 * @return string
	 */
	public function setError($error)
	{
		$this->_error .= $error.'<br />';
	}

	/**
	 * 检测IP是否在禁止列表
	 */
	private function _checkIp()
	{
		if (!empty($this->_filter['ip']) && is_array($this->_filter['ip'])) {
			$request = new dpRequest;
			$curIp = $request->getUserIp();
			unset($request);

			foreach ($this->_filter['ip'] as $ip) {
				if(stripos($ip, '-') === false) {
					if($ip == $curIp) {
						$this->setError($this->_info[1]);
						return false;
					}
				} else {
					$ip  = str_replace('.', '' , $ip);
					$curIp = str_replace('.', '', $curIp);
					$ips = explode('-', $ip);
					if ($ip > $ips[0] && $ip < $ips[1]) {
						$this->setError($this->_info[1]);
						return false;
					}
				}
			}
		}
		else return true;
	}

	/**
	 * 检测当前用户是否在禁止访问列表
	 */
	private function _checkUserName()
	{
		if (empty($this->_filter['username'])) return false;
		if (in_array($this->_user->getName(), $this->_filter['username']))
			$this->setError($this->_info[2]);
	}

	/**
	 * 自定义过滤方法
	 */
	private function _checkMethod()
	{
		if (empty($this->_filter['method'])) return false;
		$method = $this->_filter['method'];
		method_exists($this->_control, $method) && $this->_control->$method();
 	}
}
?>